package com.bluebridgecup.BasicAlgorithms.oneDimensionPrefixSumAndDifference;

import java.util.Scanner;

// 该类用于解决将数组中所有元素变为1的最少操作次数问题
// 每次操作可选择一个区间，将区间内所有数字减1
public class ArrayToOneOperator {
    public static void main(String[] args) {
        // 创建Scanner对象，用于从控制台读取用户输入
        Scanner sc = new Scanner(System.in);
        // 读取数组的长度n
        int n = sc.nextInt();
        // 创建数组a，长度为n + 1，多开辟一个位置a[0]，方便后续差分数组的计算
        int[] a = new int[n + 1];
        // 创建差分数组b，长度同样为n + 1，用于记录原数组相邻元素的差值
        int[] b = new int[n + 1];
        // 初始化变量ans，用于存储将数组所有元素变为1所需的最少操作次数
        long ans = 0;

        // 循环读取数组a的元素，从下标1开始存储用户输入的值
        for (int i = 1; i <= n; i++) {
            a[i] = sc.nextInt();
            // 计算差分数组b的元素，b[i]表示原数组a中a[i]与a[i - 1]的差值
            b[i] = a[i] - a[i - 1];
            // 如果b[i]大于0，说明从a[i - 1]到a[i]原数组的值是增加的
            // 为了使数组元素最终变为1，需要对这部分增加的值进行相应次数的减1操作
            // 所以将b[i]累加到ans中
            if (b[i] > 0) {
                ans += b[i];
            }
        }

        // 由于前面计算的ans是基于将数组元素变为0的操作次数
        // 而题目要求是变为1，所以需要将ans减去1，得到最终的最少操作次数并输出
        System.out.println(ans - 1);
    }
}